package com.zhxy.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import org.apache.commons.lang3.time.DateFormatUtils;


/**
 * 日期格式化
 * @author YDZ
 */
public class DateFormatUtil {

    public static final String FORMAT_DATE_NORMAL = "yyyy-MM-dd";
    public static final String FORMAT_DATE_SHORT = "yyyyMMdd";
    public static final String FORMAT_DATE_UNDERLINE = "yyyy_MM_dd";
    public static final String FORMAT_DATETIME_NORMAL = "yyyy-MM-dd HH:mm:ss";
    public static final String FORMAT_DATETIME_SHORT = "yyyyMMddHHmmss";
    public static final String FORMAT_DATETIME_MINUTE = "yyyy-MM-dd HH:mm";
    public static final String FORMAT_DATETIME_SHORT_MINUTE = "yyyyMMddHHmm";
    public static final String FORMAT_DATETIME_SHORT_HOUR = "yyyyMMddHH";
    public static final String FORMAT_DATETIME_NORMAL_HOUR = "yyyy-MM-dd HH";
    public static final String FORMAT_TIME_MINUTE = "HH:mm";
    public static final String FROMAT_TIME_MINUTE_SECOND = "HH:mm:ss";
    public static final String FROMAT_TIME_MINUTE_SECOND_SHORT = "HHmmss";
    public static final String FROMAT_UNIQUE_TIME = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
    public static final String FORMAT_DATETIME_NORMAL_OTHER = "yyyy-MM-dd-HH:mm:ss";

    /**
     * 避免被实例化
     */
    private DateFormatUtil() {
    }

    /**
     * 将日期格式化为字符串
     * @return date为null时反回null，出错时返回 null
     */
    public static String formatDate(Date date, String pattern) {
        if (date != null) {
            try {
                return DateFormatUtils.format(date, pattern);
            } catch (Exception e) {
            }
        }
        return null;
    }

    /**
     * 将日期格式化为字符串，格式为 yyyy-MM-dd
     * @return 出错时返回 null
     */
    public static String formatDateNormal(Date date) {
        return formatDate(date, FORMAT_DATE_NORMAL);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyyMMdd
     * @return 出错时返回 null
     */
    public static String formatDateShort(Date date) {
        return formatDate(date, FORMAT_DATE_SHORT);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyy-MM-dd HH:mm:ss
     * @return 出错时返回 null
     */
    public static String formatDateTimeNormal(Date date) {
        return formatDate(date, FORMAT_DATETIME_NORMAL);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyy-MM-dd HH:mm
     * @return 出错时返回 null
     */
    public static String formatDateTimeMinute(Date date) {
        return formatDate(date, FORMAT_DATETIME_MINUTE);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyyMMddHHmmss
     * @return 出错时返回 null
     */
    public static String formatDateTimeShort(Date date) {
        return formatDate(date, FORMAT_DATETIME_SHORT);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyy-MM-dd HH
     * @return 出错时返回 null
     */
    public static String formatDateTimeNormalHour(Date date) {
        return formatDate(date, FORMAT_DATETIME_SHORT);
    }

    /**
     * 将日期格式化为字符串，格式为 yyyyMMddHHmm
     * @return 出错时返回 null
     */
    public static String formatDateTimeShortMinute(Date date) {
        return formatDate(date, FORMAT_DATETIME_SHORT_MINUTE);
    }

    /**
     * 将日期格式化为字符串，格式为 HH:mm
     * @return 出错时返回 null
     */
    public static String formatTimeMinute(Date date) {
        return formatDate(date, FORMAT_TIME_MINUTE);
    }

    /**
     * 将日期格式化为字符串，格式为 HH:mm:ss
     * @return 出错时返回 null
     */
    public static String formatTimeMinuteSecond(Date date) {
        return formatDate(date, FROMAT_TIME_MINUTE_SECOND);
    }

    /**
     * 将日期格式化为字符串，格式为 HHmmss
     * @return 出错时返回 null
     */
    public static String formatTimeMinuteSecondShort(Date date) {
        return formatDate(date, FROMAT_TIME_MINUTE_SECOND_SHORT);
    }

    /**
     * 将日期格式化为字符串，格式为 HH:mm:ss
     * @return 出错时返回 null
     */
    public static String formatDateTimeUnique(Date date) {
        return formatDate(date, FROMAT_UNIQUE_TIME);
    }

    /**
     * 使用指定格式，将时间列表转换为字符串列表
     * @param pattern 字符串格式
     * @return 顺序与原来相同。如果时间列表为null，或含有null元素，则返回null。
     */
    public static List<String> formatDates(List<Date> dates, String pattern) {
        if (dates == null || dates.contains(null)) {
            return null;
        }
        List<String> result = new ArrayList<String>();
        for (Date date : dates) {
            result.add(formatDate(date, pattern));
        }
        return result;
    }

    /**
     * 将字符串转换为日期
     * @param str 进行转换的字符串
     * @param pattern 日期格式
     * @param zone 时区
     * @return 转换出错则返回 null
     */
    public static Date parseDate(String str, String pattern, TimeZone zone) {
        Date d;
        try {
            DateFormat df = new SimpleDateFormat(pattern);
            if (zone != null) {
                df.setTimeZone(zone);
            }
            d = df.parse(str);
        } catch (Exception e) {
            d = null;
        }
        return d;
    }

    /**
     * 将字符串转换为日期
     * @param str 进行转换的字符串
     * @param pattern 日期格式
     * @return 转换出错则返回 null
     */
    public static Date parseDate(String str, String pattern) {
        return parseDate(str, pattern, null);
    }

    /**
     * 将字符串转换为日期，格式为 yyyy-MM-dd
     * @return 转换出错则返回 null
     */
    public static Date parseDateNormal(String str) {
        return parseDate(str, FORMAT_DATE_NORMAL);
    }

    /**
     * 将字符串转换为日期，格式为 yyyyMMdd
     * @return 转换出错则返回 null
     */
    public static Date parseDateShort(String str) {
        return parseDate(str, FORMAT_DATE_SHORT);
    }

    /**
     * 将字符串转换为日期，格式为 yyyy-MM-dd HH:mm:ss
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeNormal(String str) {
        return parseDate(str, FORMAT_DATETIME_NORMAL);
    }

    /**
     * 将字符串转换为日期，格式为 yyyyMMddHHmmss
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeShort(String str) {
        return parseDate(str, FORMAT_DATETIME_SHORT);
    }

    /**
     * 将字符串转换为日期，格式为 yyyyMMddHH
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeShortHour(String str) {
        return parseDate(str, FORMAT_DATETIME_SHORT_HOUR);
    }

    /**
     * 将字符串转换为日期，格式为 yyyy-MM-dd HH:mm
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeMinute(String str) {
        return parseDate(str, FORMAT_DATETIME_MINUTE);
    }

    /**
     * 将字符串转换为日期，格式为 yyyyMMddHHmm
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeShortMinute(String str) {
        return parseDate(str, FORMAT_DATETIME_SHORT_MINUTE);
    }

    /**
     * 将字符串转换为日期，格式为 HH:mm
     * @return 转换出错则返回 null
     */
    public static Date parseTimeMinute(String str) {
        return parseDate(str, FORMAT_TIME_MINUTE);
    }

    /**
     * 将字符串转换为日期，格式为 HH:mm:ss
     * @return 转换出错则返回 null
     */
    public static Date parseTimeMinuteSecond(String str) {
        return parseDate(str, FROMAT_TIME_MINUTE_SECOND);
    }

    /**
     * 将字符串转换为日期，格式为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
     * @return 转换出错则返回 null
     */
    public static Date parseDateTimeUnique(String str) {
        return parseDate(str, FROMAT_UNIQUE_TIME);
    }

    /**
     * 将秒转为日期格式的字符串，格式为：HH:mm:ss
     * @param time
     * @return
     */
    public static String parseSecondsFormat(int time) {
        int hour = time / 3600;
        int minute = time / 60 % 60;
        int second = time % 60;
        return hour + ":" + minute + ":" + second;
    }

}
